/**
 * Copyright (c) 2013-2016, Jieven. All rights reserved.
 * <p>
 * Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
 * To use it on other terms please contact us at 1623736450@qq.com
 */
package com.oss;

import java.util.HashMap;

import com.eova.common.utils.xx;
import com.eova.config.EovaConfig;
import com.eova.interceptor.LoginInterceptor;
import com.feizhou.swagger.config.routes.SwaggerRoutes;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.Prop;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.weixin.sdk.api.ApiConfig;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.oss.biz.DealerController;
import com.oss.biz.OrderController;
import com.oss.biz.UserController;
import com.oss.model._MappingKit;
import com.oss.test.TestController;
import com.oss.utils.constants.DataDictionary;
import com.oss.weixin.controller.ShareController;
import com.oss.weixin.controller.WeiXinOauthController;
import com.oss.weixin.controller.WeixinApiController;
import com.oss.weixin.controller.WeixinMsgController;
import com.oss.weixin.controller.WeixinPayController;

public class OSSConfig extends EovaConfig {

    /**
     * 如果要支持多公众账号，只需要在此返回各个公众号对应的 ApiConfig 对象即可 可以通过在请求 url 中挂参数来动态从数据库中获取
     * ApiConfig 属性值
     */
    public static ApiConfig getApiConfig() {

        // 获取配置文件
        Prop prop = DataDictionary.getProp();

        ApiConfig ac = new ApiConfig();

        // 配置微信 API 相关常量
        ac.setToken(prop.get("token"));
        ac.setAppId(prop.get("appId"));
        ac.setAppSecret(prop.get("appSecret"));

        /**
         * 是否对消息进行加密，对应于微信平台的消息加解密方式： 1：true进行加密且必须配置 encodingAesKey
         * 2：false采用明文模式，同时也支持混合模式
         */
        ac.setEncryptMessage(prop.getBoolean("encryptMessage", false));
        ac.setEncodingAesKey(prop.get("encodingAesKey", "setting it in config file"));
        return ac;
    }

    @Override
    public void afterJFinalStart() {
        ApiConfigKit.putApiConfig(getApiConfig());
    }

    /**
     * 自定义路由
     *
     * @param me
     */
    @Override
    protected void route(Routes me) {
        // api注解
        me.add(new SwaggerRoutes());
        // 自定义的路由配置往这里加。。。
        me.add("/", OSSController.class);

        // 微信
        me.add("/msg", WeixinMsgController.class);
        me.add("/api", WeixinApiController.class);
        me.add("/oauth", WeiXinOauthController.class);
        me.add("/pay", WeixinPayController.class);
        // me.add("/jssdk", JSSDKController.class, "/view");

        // 主业务
        me.add("/test", TestController.class);
        me.add("/share", ShareController.class);
        me.add("/dealer", DealerController.class);
        me.add("/user", UserController.class);
        me.add("/order", OrderController.class);

        // 排除不需要登录拦截的URI 语法同SpringMVC拦截器配置 @see
        // com.eova.common.utils.util.AntPathMatcher

        // 系统级别 慎重删
        LoginInterceptor.excludes.add("/test/**");
        LoginInterceptor.excludes.add("/init");
        LoginInterceptor.excludes.add("/code");

        // 微信级别 慎重删
        LoginInterceptor.excludes.add("/msg/**");
        LoginInterceptor.excludes.add("/api/**");
        LoginInterceptor.excludes.add("/oauth/**");
        LoginInterceptor.excludes.add("/pay/**");
        LoginInterceptor.excludes.add("/share/**");

        // 业务级别
        LoginInterceptor.excludes.add("/info/**");
        LoginInterceptor.excludes.add("/swagger/**");
        LoginInterceptor.excludes.add("/sale/**");
        LoginInterceptor.excludes.add("/order/**");
        LoginInterceptor.excludes.add("/user/**");
        LoginInterceptor.excludes.add("/dealer/**");

    }

    /**
     * 自定义Main数据源Model映射
     *
     * @param
     */
    @Override
    protected void mapping(HashMap<String, ActiveRecordPlugin> arps) {
        // 获取主数据源的ARP
        ActiveRecordPlugin main = arps.get(xx.DS_MAIN);
        _MappingKit.mapping(main);

        // 获取其它数据源的ARP
        // ActiveRecordPlugin xxx = arps.get("xxx");
    }

    /**
     * 自定义插件
     */
    @Override
    protected void plugin(Plugins plugins) {

    }

    /**
     * 自定义表达式(主要用于级联)
     */
    @Override
    protected void exp() {
        super.exp();
        // 区域级联查询
        exps.put("selectAreaByLv2AndPid", "select id ID,name CN from area where lv = 2 and pid = ?");
        exps.put("selectAreaByLv3AndPid", "select id ID,name CN from area where lv = 3 and pid = ?");
        exps.put("selectEovaMenu", "select id,parent_id pid, name, iconskip from eova_menu;ds=eova");

        // 用法，级联动态在页面改变SQL和参数
        // $xxx.eovacombo({exp : 'selectAreaByLv2AndPid,aaa,10'}).reload();
        // $xxx.eovafind({exp : 'selectAreaByLv2AndPid,aaa,10'});
        // $xxx.eovatree({exp : 'selectAreaByLv2AndPid,10'}).reload();
    }

    @Override
    protected void authUri() {
        super.authUri();

        // 放行所有角色,所有URI(我是小白,我搞不明白URI配置,请使用这招,得了懒癌也可以这样搞后果自负.)
        // HashSet<String> uris = new HashSet<String>();
        // uris.add("/**/**");
        // authUris.put(0, uris);

        // 单独放行某角色xxx业务
        // uris.add("/xxx/**");
        // authUris.put(角色ID, uris);

        // URI配置语法咋么写?
        // @see AntPathMatcher
    }

}